package estacion.acciones;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import com.opensymphony.xwork2.ActionSupport;

import estacion.dominio.Autobus;
import estacion.dominio.Estacion;
import estacion.dominio.Linea;
import estacion.dominio.Persona;
import estacion.dominio.Producto;
import estacion.dominio.Revisor;
import estacion.dominio.Taxi;
import estacion.dominio.Tienda;
import estacion.dominio.TiposLicencia;
import estacion.dominio.Conductor;
import estacion.dominio.Tramo;
import estacion.dominio.Tren;
import estacion.dominio.Vehiculo;
import estacion.dominio.Vendedor;

public class GestorDatosLicencias extends ActionSupport{
	private static final long serialVersionUID = 1L;
	
	private List<Persona> conductores;
	private Conductor conductor;
	
	private boolean gestion;
	private boolean no_coinciden;
	
	private String dni;
	private String licencia;
	private String tipo_vehiculo;
	
	private ArrayList<String> vehiculos;	
	private ArrayList<String> licencias;
	
	private int operacion;

	private boolean campos_vacios;
	
	@Override
	public String execute() throws Exception {
		this.conductor=new Conductor();
		this.licencias = new ArrayList<String>();

		gestion = false;
		no_coinciden = false;
		campos_vacios = false;

		if(this.operacion==Constantes.BUSCARCON2){
			this.conductores=this.conductor.getPersonas();
		}
		else if(this.operacion==Constantes.MODIFICAR){
			if(!this.getLicencia().equals("")){
				if(coincidenLicencias()){
					this.modificar();
					gestion = true;
				}
				else no_coinciden = true;
			}
			else campos_vacios = true;
		}

		return SUCCESS;		
    }
	
	private void modificar() throws Exception {
		TiposLicencia aux = new TiposLicencia();
		
		int codigo_linea = 0;
		
		conductor = (Conductor) conductor.consultarPersona(dni);
		
		if(conductor != null){
			//Eliminamos los billetes del conductor
			if(!conductor.getLicencia().getTipo_licencia().equals("taxi")){
				if(conductor.getLicencia().getTipo_licencia().equals("tren")){
					Tren tr=new Tren();
					tr=(Tren) tr.consultarVehiculo(((Conductor) conductor).getTipo_vehiculo());
					codigo_linea=tr.getLinea().getCodigo_linea();
				}else if(conductor.getLicencia().getTipo_licencia().equals("bus")){
					Autobus b=new Autobus();
					b=(Autobus) b.consultarVehiculo(((Conductor) conductor).getTipo_vehiculo());
					codigo_linea=b.getLinea().getCodigo_linea();
				}
				Producto pr=new Producto();
				pr.eliminarBillete(codigo_linea);
			}
			
			aux.setTipo_licencia(this.getLicencia());
			conductor.setLicencia(aux);
			conductor.setTipo_vehiculo(this.getTipo_vehiculo());
			conductor.modificarPersona();
		}								
	}
	
	private boolean coincidenLicencias() throws Exception {
		Taxi t=new Taxi();
		t=(Taxi) t.consultarVehiculo(this.getTipo_vehiculo());
		return t.get_Licencia_necesitada().equals(this.getLicencia());
	}
	
	public void setOperacion(String operacion){
		if (operacion.equalsIgnoreCase("Buscar_conductores"))
			this.operacion = Constantes.BUSCARCON2;
		else if (operacion.equalsIgnoreCase("Modificar"))
			this.operacion=Constantes.MODIFICAR;
		else if(operacion.equalsIgnoreCase("Cargar datos"))
			this.operacion=Constantes.CARGAR;
	}
	
	public ArrayList<String> tienda() throws Exception{
		Tienda tienda=new Tienda();
		Vendedor vend=new Vendedor();
		List<Persona> vends=vend.getPersonas();
		List<Tienda> tiendas=tienda.getTiendas();
		ArrayList<String>tie = new ArrayList<String>();
		tie.add("--");
		for(int k=0;k<tiendas.size();k++) tie.add(tiendas.get(k).getTipo_producto());
		for(int i=0;i<vends.size();i++){
			for(int j=0;j<tie.size();j++){
				if(tie.get(j).equals(tienda.consultTiendaporCodigo(((Vendedor) vends.get(i)).gettienda().getCodigo_Tienda()).getTipo_producto())){
					tie.remove(j);
				}
			}
		}
		return tie;
	}
	
	public ArrayList<String> vehiculos() throws Exception{
		Taxi taxi=new Taxi();
		Autobus autobus=new Autobus();
		Tren tren=new Tren();
		Conductor cond=new Conductor();
		List<Persona> conds=cond.getPersonas();
		Revisor rev=new Revisor();
		List<Persona> revs=rev.getPersonas();
		List<Vehiculo> taxis=taxi.getVehiculos();
		List<Vehiculo> trenes=tren.getVehiculos();
		List<Vehiculo> autobuses=autobus.getVehiculos();
		vehiculos = new ArrayList<String>();
		vehiculos.add("--");
		for(int i=0;i<taxis.size();i++)	vehiculos.add(taxis.get(i).getCodigo_vehiculo());
		for(int i=0;i<trenes.size();i++)vehiculos.add(trenes.get(i).getCodigo_vehiculo());
		for(int i=0;i<autobuses.size();i++)vehiculos.add(autobuses.get(i).getCodigo_vehiculo());
		for(int i=0;i<conds.size();i++){
			for(int j=0;j<vehiculos.size();j++){
				if(vehiculos.get(j).equals((((Conductor) conds.get(i)).getTipo_vehiculo()))){
					vehiculos.remove(j);
				}
			}
		}
		for(int i=0;i<revs.size();i++){
			for(int j=0;j<vehiculos.size();j++){
				if(vehiculos.get(j).equals((((Revisor) revs.get(i)).getTipo_vehiculo()))){
					vehiculos.remove(j);
				}
			}
		}
		
		return vehiculos;
	}
	
	public ArrayList<Integer> codigos_lineas() throws Exception{
		Linea lin = new Linea();
		ArrayList<Integer> codigos = new ArrayList<Integer>();
		Vector<Linea> lineas = new Vector<Linea>();
		
		lineas = lin.getLineas();
		
		for(int i=0; i<lineas.size();i++) codigos.add(lineas.get(i).getCodigo_linea());
		
		return codigos;
	}
	
	public ArrayList<String> linea() throws Exception{
		Linea linea=new Linea();
		Tramo t=new Tramo();
		Tren tr=new Tren();
		Autobus b=new Autobus();
		List<Vehiculo> trenes=tr.getVehiculos();
		List<Vehiculo> buses=b.getVehiculos();
		List<Linea> lineas=linea.getLineas();
		ArrayList<String> lin = new ArrayList<String>();
		lin.add("--");
		for(int i=0;i<lineas.size();i++){
			if(t.consultarTramos(lineas.get(i).getCodigo_linea())>0)lin.add(lineas.get(i).getnombre());
		}
		for(int i=0;i<trenes.size();i++){
			for(int j=0;j<lin.size();j++){
				if(lin.get(j).equals(linea.consultarLinea(((Tren)trenes.get(i)).getLinea().getCodigo_linea()).getnombre())){
					lin.remove(j);
				}
			}
		}
		for(int i=0;i<buses.size();i++){
			for(int j=0;j<lin.size();j++){
				if(lin.get(j).equals(linea.consultarLinea(((Autobus)buses.get(i)).getLinea().getCodigo_linea()).getnombre())){
					lin.remove(j);
				}
			}
		}
		return lin;
	}
	
	public ArrayList<String> nombres_lineas() throws Exception{
		Linea lin = new Linea();
		ArrayList<String> nombres = new ArrayList<String>();
		Vector<Linea> lineas = new Vector<Linea>();
		
		lineas = lin.getLineas();
		
		for(int i=0; i<lineas.size();i++) nombres.add(lineas.get(i).getnombre());
		
		return nombres;
	}
	public ArrayList<String> nombres_lineas_sin() throws Exception{
		Linea lin = new Linea();
		Tren t = new Tren();
		ArrayList<String> nombres = new ArrayList<String>();
		Vector<Linea> lineas = new Vector<Linea>();
		
		lineas = lin.getLineas();
		
		for(int i=0; i<lineas.size();i++){
			if(t.consultarVehiculoLinea(lineas.get(i).getCodigo_linea()) == null){
				nombres.add(lineas.get(i).getnombre());
			}
		}
		
		return nombres;
	}
	
	public ArrayList<String> li(){
		licencias = new ArrayList<String>();
		licencias.add("--");
		licencias.add("tren");
		licencias.add("taxi");
		licencias.add("bus");
		return licencias;
	}
	
	public List<String> estaciones() throws Exception {
		Estacion e = new Estacion();
		List<Estacion> aux = e.getEstaciones();
		List<String> estaciones = new ArrayList<String>();
		for(int i=0; i<aux.size();i++) estaciones.add(aux.get(i).getEstacion());
		
		return estaciones;
	}

	public String getDni() {
		return dni;
	}

	public void setDni(String dni) {
		this.dni = dni;
	}

	public List<Persona> getConductores() {
		return conductores;
	}

	public void setConductores(List<Persona> conductores) {
		this.conductores = conductores;
	}

	public Conductor getConductor() {
		return conductor;
	}

	public void setConductor(Conductor conductor) {
		this.conductor = conductor;
	}
	
	public String getLicencia(){
		return licencia;
	}
	
	public void setLicencia(String licencia){
		this.licencia = licencia;
	}

	public ArrayList<String> getVehiculos() {
		return vehiculos;
	}

	public void setVehiculos(ArrayList<String> vehiculos) {
		this.vehiculos = vehiculos;
	}

	public ArrayList<String> getLicencias() {
		return licencias;
	}

	public void setLicencias(ArrayList<String> licencias) {
		this.licencias = licencias;
	}

	public String getTipo_vehiculo() {
		return tipo_vehiculo;
	}

	public void setTipo_vehiculo(String tipo_vehiculo) {
		this.tipo_vehiculo = tipo_vehiculo;
	}
	public List<Estacion> getEstaciones() throws Exception {
		Estacion e=new Estacion();
		return e.getEstaciones();
	}

	public boolean isGestion() {
		return gestion;
	}

	public void setGestion(boolean gestion) {
		this.gestion = gestion;
	}

	public boolean isNo_coinciden() {
		return no_coinciden;
	}

	public void setNo_coinciden(boolean no_coinciden) {
		this.no_coinciden = no_coinciden;
	}

	public boolean isCampos_vacios() {
		return campos_vacios;
	}

	public void setCampos_vacios(boolean campos_vacios) {
		this.campos_vacios = campos_vacios;
	}

}
